package com.zbkj.common.utils;

import java.util.Random;
import java.util.UUID;

/**
 * uuid工具类
 *
 * @author ywy
 * @since 2021-06-03
 */
public class UuidUtil {

    public static String get32UuId() {
        String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
        return uuid;
    }

    public static String get32UuId(String title) {
        String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
        return title + uuid;
    }

    /**
     * @return 生成编号
     */
    public static String get12UuId() {
        //最大支持1-9个集群机器部署
        int machineId = 1;
        int hashCodev = UUID.randomUUID().toString().hashCode();
        if (hashCodev < 0) {
            //有可能是负数
            hashCodev = -hashCodev;
        }
        //"%012d"的意思：0代表不足位数的补0，这样可以确保相同的位数，12是位数也就是要得到到的字符串长度是15，d代表数字。
        return machineId + String.format("%011d", hashCodev);
    }

    public static void main(String[] args) {
        System.out.println(get12UuId());
    }

    /**
     * 随机生成由数字、字母组成的N位随机数
     *
     * @return 返回一个字符串
     */
    public static String getCode(int n) {
        char[] arr = new char[n];
        int i = 0;
        Random random = new Random();
        while (i < n) {
            char ch = (char) random.nextInt(123);
            if (ch == 'L' || ch == 'l' || ch == 'i' || ch == '0' || ch == 'o' || ch == 'O') {
                continue;
            }
            if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9') {
                arr[i++] = ch;
            }
        }
        //将数组转为字符串
        return new String(arr);
    }

    /**
     * 随机指定范围内N个不重复的数<br/>
     * 在初始化的无重复待选数组中随机产生一个数放入结果中，
     * 将待选数组被随机到的数，用待选数组(len-1)下标对应的数替换
     * 然后从len-2里随机产生下一个随机数，如此类推
     *
     * @param max 指定范围最大值
     * @param min 指定范围最小值
     * @param n   随机数个数
     * @return int[] 随机数结果集
     */
    public static int[] randomArray(int min, int max, int n) {
        int len = max - min + 1;

        if (max < min || n > len) {
            return null;
        }

        //初始化给定范围的待选数组
        int[] source = new int[len];
        for (int i = min; i < min + len; i++) {
            source[i - min] = i;
        }

        int[] result = new int[n];
        Random rd = new Random();
        int index = 0;
        for (int i = 0; i < result.length; i++) {
            //待选数组0到(len-2)随机一个下标
            index = Math.abs(rd.nextInt() % len--);
            //将随机到的数放入结果集
            result[i] = source[index];
            //将待选数组中被随机到的数，用待选数组(len-1)下标对应的数替换
            source[index] = source[len];
        }
        return result;
    }
}


